package main

import "fmt"

// 空接口就是没定义任何方法的接口。也就是说任何类型都实现了空接口。空接口类型的变量可以存储任意类型的变量。
func main() {
	var x interface{} // 定义一个空接口
	s := "zhang"
	x = s
	fmt.Printf("type:%T value:%v\n", x, x)
	i := 10
	x = i
	fmt.Printf("type:%T value:%v\n", x, x)
	b := true
	x = b
	fmt.Printf("type:%T value:%v\n", x, x)
}

// 由于空接口能够接受任意类型的变量，在go中，空接口常用作函数的参数
func show(a interface{}) {
	fmt.Printf("type:%T value:%v\n", a, a)
}

func mainl() {
	s := "zhang"
	show(s)
	b := true
	show(b)
}

// 2、类型断言
// 如前面所说空接口可以接受任意类型的变量，既然如此，那如何才能知道空接口接收到的具体的值和值得类型呢？此时需要用到类型断言
//
// 语法格式： x.(T)，其中：
//
// x：类型为 interface{} 的变量
// T：断言 x 可能是的类型
// 该语法返回两个参数，第一个参数是 x 转化为 T 类型后的变量，第二个值是一个布尔值，若为 true 则表示断言成功，为 false 则表示断言失败。
func mailn() {
	var x interface{}
	x = 888
	switch val := x.(type) {
	case string:
		fmt.Printf("x is a string，value is %v\n", val)
	case int:
		fmt.Printf("x is a int，value is %v\n", val)
	case bool:
		fmt.Printf("x is a bool，value is %v\n", val)
	default:
		fmt.Println("unsupport type！")
	}
}
